//给你一个 m 行 n 列的矩阵 matrix ，请按照 顺时针螺旋顺序 ，返回矩阵中的所有元素。
//
//
//
// 示例 1：
//
//
//输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
//输出：[1,2,3,6,9,8,7,4,5]
//
//
// 示例 2：
//
//
//输入：matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
//输出：[1,2,3,4,8,12,11,10,9,5,6,7]
//
//
//
//
// 提示：
//
//
// m == matrix.length
// n == matrix[i].length
// 1 <= m, n <= 10
// -100 <= matrix[i][j] <= 100
//
//
// Related Topics 数组与矩阵 矩阵 模拟 👍 1376 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
function spiralOrder(matrix: number[][]): number[] {

    if (!matrix.length) return [];
    let n = matrix.length;
    let m = matrix[0].length;
    let total = n * m;
    let top = 0,
        bottom = n - 1;
    let left = 0,
        right = m - 1;
    let res = [];
    while (res.length < total) {
        //左到右
        for (let i = left; i <= right; i++) res.push(matrix[top][i]); // 从左到右
        top++;
        // 上到下
        for (let i = top; i <= bottom; i++) res.push(matrix[i][right]); // 从上到下
        right--;
        /* 因为n 和 m 不相同的时候，最后可能会留一列或一行，避免重复计算，总数够了直接跳出去 */
        if (res.length === total) break;
        // 右到左
        for (let i = right; i >= left; i--) res.push(matrix[bottom][i]); // 从右到左
        bottom--;
        // 下到上
        for (let i = bottom; i >= top; i--) res.push(matrix[i][left]); // 从下到上
        left++;
    }
    return res;

};
//leetcode submit region end(Prohibit modification and deletion)
